package com.uc3m.dsic.gestorZoo;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * En esta clase se encuentran todos las operaciones que tratan principalmente
 * con los horarios
 *
 * @author Dario Peralta
 */
public class GestorHorario {

    /**
     * Obtener los horarios de los animales que son cuidados por un determinado
     * cuidador.
     *
     * @param id_cuidador
     *          Identificador de cuidador
     * @return Un array list de horarios
     * @throws Exception
     */
    public ArrayList<Horario> getHorariobyEspecie(String id_cuidador)
            throws Exception {

        GestorZooInterface izoo = new GestorZooAplicacion();
        ArrayList<Horario> horario = new ArrayList<Horario>();
        ArrayList<String> animalesCuidados = new ArrayList<String>();
        ArrayList<String> animales = new ArrayList<String>();
        Horario hora = null;
        String idCuidador, nombreAnimalCuida, especieAnimalCuida, nombreAnimal,
                especieAnimal, nombreHorario, especieHorario, fechaHorario,
                tipoComida;
        Iterator iteradorCuida, iteradorAnimal;

        ResultSet rsHorario = izoo.getTabla(GestorZooAplicacion.Tablas.HORARIO);
        ResultSet rsAnimal = izoo.getTabla(GestorZooAplicacion.Tablas.ANIMAL);
        ResultSet rsCuida = izoo.getTabla(GestorZooAplicacion.Tablas.CUIDA);

        while (rsCuida.next()) {
            //obtenemos identificador cuidador de CUIDA
            idCuidador = rsCuida.getString(3).toUpperCase();
            //si es el mismo que el pasado por parametro...
            if (idCuidador.compareTo(id_cuidador.toUpperCase()) == 0) {
                //obtengo la clave principal de animal (nombre y especie)
                nombreAnimalCuida = rsCuida.getString(1).toUpperCase();
                especieAnimalCuida = rsCuida.getString(2).toUpperCase();
                animalesCuidados.add(nombreAnimalCuida);
                animalesCuidados.add(especieAnimalCuida);
            }
        }

        iteradorCuida = animalesCuidados.iterator();

        while (iteradorCuida.hasNext()) {
            nombreAnimalCuida = (String) iteradorCuida.next();
            especieAnimalCuida = (String) iteradorCuida.next();

            //empezamos a recorrer las tuplas de animal
            while (rsAnimal.next()) {
                nombreAnimal = rsAnimal.getString(1).toUpperCase();
                especieAnimal = rsAnimal.getString(2).toUpperCase();
                //si la clave de animal obtenida es la misma
                //que la de la tupla actual...
                if (nombreAnimalCuida.compareTo(nombreAnimal) == 0 &&
                        especieAnimalCuida.compareTo(especieAnimal) == 0) {
                    animales.add(nombreAnimal);
                    animales.add(especieAnimal);
                }
            }
            rsAnimal = izoo.getTabla(GestorZooAplicacion.Tablas.ANIMAL);
        }

        iteradorAnimal = animales.iterator();

        while (iteradorAnimal.hasNext()) {
            nombreAnimal = (String) iteradorAnimal.next();
            especieAnimal = (String) iteradorAnimal.next();
            //empezamos a recorrer tuplas de horario
            while (rsHorario.next()) {
                nombreHorario = rsHorario.getString(2).toUpperCase();
                especieHorario = rsHorario.getString(3).toUpperCase();
                if (nombreAnimal.compareTo(nombreHorario) == 0
                        && especieAnimal.compareTo(especieHorario) == 0) {
                    fechaHorario = rsHorario.getString(1).toUpperCase();
                    tipoComida = rsHorario.getString(4).toUpperCase();
                    hora = new Horario(fechaHorario, tipoComida, nombreHorario,
                            especieHorario);
                    horario.add(hora);
                }
            }
            rsHorario = izoo.getTabla(GestorZooAplicacion.Tablas.HORARIO);
        }
        return horario;
    }

    /**
     * Obtiene el resultado concreto de la base de datos proporcionado por un
     * identificador de horario
     *
     * @param fecha_horario
     *          Fecha del horario
     * @param nombre_horario
     *          Nombre del animal de dicho horario
     * @param especie_horario
     *          Especie del animal de dicho horario
     * @return Fila con todos los campos que coinciden con la clave proporcionada
     * @throws ZooException
     * @throws Exception
     */
    public Horario getHorariobyId(String fecha_horario, String nombre_horario,
            String especie_horario) throws Exception, ZooException {

        ResultSet rstemp;
        Horario nuevo_horario = null;

        String fechaHorario, nombreAnimal, especieAnimal, tipoComida;

        GestorZooInterface gtemp = new GestorZooAplicacion();
        rstemp = gtemp.getTabla(GestorZooAplicacion.Tablas.HORARIO);

        while (rstemp.next()) {
            fechaHorario = rstemp.getString(1).toUpperCase();
            nombreAnimal = rstemp.getString(2).toUpperCase();
            especieAnimal = rstemp.getString(3).toUpperCase();
            if (fecha_horario.trim().toUpperCase().compareTo(fechaHorario) == 0
                    && nombre_horario.trim().toUpperCase()
                        .compareTo(nombreAnimal) == 0
                    && especie_horario.trim().toUpperCase()
                        .compareTo(especieAnimal) == 0) {
                tipoComida = rstemp.getString(4).toUpperCase();
                nuevo_horario = new Horario(fechaHorario, tipoComida,
                        nombreAnimal, especieAnimal);
                return nuevo_horario;
            }
        }
        return nuevo_horario ;
    }
}
